home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 6 / Night Owl's Shareware - PDSI-006 - Night Owl Corp (1990).iso / 019a / view002.zip / VIEWDIR.C < prev    next >
C/C++ Source or Header  |  1991-09-14  |  7KB  |  323 lines

  1. /*
  2. View 0.02 - A simple,small,windowed, text file viewer.
  3.  
  4. Copyright (c) 1991 James P. Goodwin.
  5. All rights reserved.
  6.  
  7. Redistribution and use in source and binary forms are per-
  8. mitted provided that the above copyright notice is dupli-
  9. cated in all such forms and that any documentation,
  10. advertising materials, and other materials related to such
  11. distribution and use acknowledge that the software was
  12. developed by James P. Goodwin.
  13.  
  14. THE SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS
  15. OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE
  16. IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PAR-
  17. TICULAR PURPOSE.
  18. */
  19.  
  20.  
  21. #include <stdio.h>
  22. #include <fcntl.h>
  23. #include <sys\types.h>
  24. #include <sys\stat.h>
  25. #include <io.h>
  26. #include <share.h>
  27. #include <stdlib.h>
  28. #include <string.h>
  29. #include <dos.h>
  30. #include <share.h>
  31. #include <conio.h>
  32. #include <limits.h>
  33. #include <direct.h>
  34. #include "view.h"
  35.  
  36. /*
  37.   View directory selection routines
  38. */
  39.  
  40. #if VIEW_HAS_DIR
  41.  
  42. int view_dir( UCHAR *name )
  43. {
  44.   int  err;
  45.   int  c1,c2;
  46.   int  olddrive;
  47.   int  newdrive;
  48.   char *test;
  49.   int  row;
  50.   DIRLIST *dir = NULL;
  51.   DIRLIST *cur = NULL;
  52.   VIEWSAVE *vs;
  53.  
  54.   vs = view_getsave(VIEW_DIR_ROW     ,VIEW_DIR_COL,
  55.                     VIEW_DIR_HEIGHT+2,VIEW_DIR_WIDTH+2);
  56.  
  57.   do
  58.     {
  59.     *name = '\0';
  60.     dir   = view_getlist();
  61.  
  62.     view_attr = GET_STRING;
  63.     view_frame(getcwd(view_line,VIEW_MAX_LINE),
  64.                VIEW_DIR_ROW     ,VIEW_DIR_COL,
  65.                VIEW_DIR_HEIGHT+2,VIEW_DIR_WIDTH+2);
  66.  
  67.     view_dirdisp( dir );
  68.  
  69.     row = 0;
  70.     cur = dir;
  71.     err = FALSE;
  72.  
  73.     do
  74.       {
  75.       view_attr = GET_STRING_CURSOR;
  76.       view_goto(VIEW_DIR_ROW+1+row,VIEW_DIR_COL+1);
  77.       view_puts(cur->line,VIEW_DIR_WIDTH);
  78.  
  79.       c1 = getch();
  80.  
  81.       switch( c1 )
  82.         {
  83.         case 0:
  84.           c2 = getch();
  85.     
  86.           switch(c2)
  87.             {
  88.             case CURSOR_DOWN:
  89.               if (cur->next)
  90.                 {
  91.                 cur = cur->next;
  92.                 row ++;
  93.                 }
  94.             break;
  95.     
  96.             case CURSOR_UP:
  97.               if (cur->prev)
  98.                 {
  99.                 cur = cur->prev;
  100.                 row --;
  101.                 }
  102.             break;
  103.     
  104.             case PGDN:
  105.               for (row = 0,cur=dir; row < VIEW_DIR_HEIGHT && cur->next; row ++,cur = cur->next);
  106.               dir = cur;
  107.               row = 0;
  108.             break;
  109.     
  110.             case PGUP:
  111.               for (row = 0,cur=dir; row < VIEW_DIR_HEIGHT && cur->prev; row ++,cur = cur->prev);
  112.               dir = cur;
  113.               row = 0;
  114.             break;
  115.     
  116.             case HOME:
  117.               for (cur = dir; cur->prev; cur=cur->prev);
  118.               dir = cur;
  119.               row = 0;
  120.             break;
  121.     
  122.             case END:
  123.               for (cur = dir; cur->next; cur=cur->next);
  124.               dir = cur;
  125.               row = 0;
  126.             break;
  127.     
  128.             default:
  129.             continue;
  130.             }
  131.         break;
  132.     
  133.         case RETURN:
  134.           for (c2 = 0; c2 < 13 && cur->line[c2] != ' '; c2 ++);
  135.           cur->line[c2] = '\0';
  136.  
  137.           if (cur->line[14] == 'd')
  138.             chdir(cur->line);
  139.           else
  140.             {
  141.             strcpy(name,cur->line);
  142.             err = TRUE;
  143.             }
  144.  
  145.           cur->line[c2] = ' ';
  146.         break;
  147.     
  148.         case ESC:
  149.           err = TRUE;
  150.         break;
  151.     
  152.         default:
  153.           c1 = toupper(c1);
  154.  
  155.           if (c1 >= 'A' && c1 <= 'Z')
  156.             {
  157.             newdrive = (c1-'A')+1;
  158.             _dos_getdrive(&olddrive);
  159.             _dos_setdrive(newdrive,&c2);
  160.  
  161.             test = getcwd(NULL,66);
  162.  
  163.             if (!test)
  164.               _dos_setdrive(olddrive,&c2);
  165.             else
  166.               free(test);
  167.  
  168.             c1 = RETURN;
  169.             break;
  170.             }
  171.  
  172.         continue;
  173.         }
  174.  
  175.       if (row < 0)
  176.         {
  177.         row = 0;
  178.         dir = dir->prev;
  179.         }
  180.       else if (row >= VIEW_DIR_HEIGHT)
  181.         {
  182.         row = VIEW_DIR_HEIGHT-1;
  183.         dir = dir->next;
  184.         }
  185.  
  186.       view_dirdisp( dir );
  187.       }
  188.     while(c1 != RETURN && c1 != ESC);
  189.  
  190.     dir = view_freelist( dir );
  191.     }
  192.   while(!err);
  193.  
  194.   view_putsave(vs);
  195.  
  196.   if (c1 == ESC)
  197.     return(FALSE);
  198.   else
  199.     return(TRUE);
  200. }
  201.  
  202.  
  203. void view_dirdisp( DIRLIST *dir )
  204. {
  205.    int row = 0;
  206.  
  207.    view_attr = GET_STRING;
  208.    do
  209.      {
  210.      view_goto(VIEW_DIR_ROW+1+row,VIEW_DIR_COL+1);
  211.      if (dir)
  212.        {
  213.        view_puts(dir->line,VIEW_DIR_WIDTH);
  214.        dir = dir->next;
  215.        }
  216.      else
  217.        view_fill(' ',VIEW_DIR_WIDTH);
  218.      row ++;
  219.      }
  220.    while(row < VIEW_DIR_HEIGHT);
  221. }
  222.  
  223. DIRLIST *view_freelist( DIRLIST *dir )
  224. {
  225.   DIRLIST *cur;
  226.  
  227.   while( dir->prev ) dir = dir->prev;
  228.  
  229.   do
  230.     {
  231.     cur = dir; 
  232.     dir = dir->next; 
  233.     free(cur->line);
  234.     free(cur);
  235.     }
  236.   while(dir);
  237.  
  238.   return(dir);
  239. }
  240.  
  241.  
  242. DIRLIST *view_getlist ( void )
  243. {
  244.   int  err;
  245.   struct find_t file;
  246.   DIRLIST *dir = NULL;
  247.  
  248.   for (err = _dos_findfirst("*.*",_A_SUBDIR,&file); !err ; err = _dos_findnext(&file))
  249.     {
  250.     if (file.attrib & _A_SUBDIR)
  251.       dir = view_addline( dir, &file );
  252.     }
  253.  
  254.   for (err = _dos_findfirst("*.*",_A_NORMAL,&file); !err ; err = _dos_findnext(&file))
  255.     {
  256.     if (!(file.attrib & _A_SUBDIR))
  257.       dir = view_addline( dir, &file );
  258.     }
  259.  
  260.   while(dir->prev) dir = dir->prev;
  261.  
  262.   return(dir);
  263. }
  264.  
  265. DIRLIST *view_addline(DIRLIST *dir, struct find_t *file)
  266. {
  267.   DIRLIST *cur;
  268.  
  269.   cur = malloc(sizeof(DIRLIST));
  270.   if (!cur) view_error(1,"VIEW0004");
  271.  
  272.   cur->line = malloc(VIEW_DIR_WIDTH+1);
  273.   if (!cur->line) view_error(1,"VIEW0005");
  274.  
  275.   if (dir)
  276.     {
  277.     cur->prev = dir;
  278.     cur->next = NULL;
  279.     dir->next = cur;
  280.     dir       = cur;
  281.     }
  282.   else
  283.     {
  284.     cur->next = NULL;
  285.     cur->prev = NULL;
  286.     dir = cur;
  287.     }
  288.  
  289.   view_fmtline(cur->line,file);
  290.  
  291.   return(dir);
  292. }
  293.  
  294. void view_fmtline(UCHAR *line, struct find_t *file)
  295. {
  296.   int idx;
  297.   UCHAR *tmp;
  298.  
  299.   for (idx = 0; idx < VIEW_DIR_WIDTH; idx ++) line[idx] = ' ';
  300.   line[VIEW_DIR_WIDTH] = '\0';
  301.  
  302.   memmove(line,file->name,strlen(file->name));
  303.  
  304.   if (file->attrib & _A_SUBDIR) 
  305.     line[14] = 'd';
  306.   else 
  307.     line[14] = ' ';
  308.  
  309.   memmove(line+17,view_ultoa((ULONG)((file->wr_date  & 0x01E0) >> 5 ),10,2,'0'),2);
  310.   line[19] = '/';
  311.   memmove(line+20,view_ultoa((ULONG)( file->wr_date  & 0x001F       ),10,2,'0'),2);
  312.   line[22] = '/';
  313.   memmove(line+23,view_ultoa((ULONG)(((file->wr_date & 0xFE00) >> 9 )+80),10,2,'0'),2);
  314.  
  315.   memmove(line+27,view_ultoa((ULONG)((file->wr_time  & 0xF800) >> 11),10,2,'0'),2);
  316.   line[29] = ':';
  317.   memmove(line+30,view_ultoa((ULONG)((file->wr_time  & 0x07E0) >> 5 ),10,2,'0'),2);
  318.  
  319.   if (!(file->attrib & _A_SUBDIR))
  320.     memmove(line+34,view_ultoa((ULONG)file->size,10,10,' '),10);
  321. }
  322. #endif /* VIEW_HAS_DIR */
  323.